package controller;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.ServletRequestBindingException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import dao.FileDao;
import dto.FileDto;

//default.jsp 에서 index.html 요청. 현재 페이지로 넘어옴. 여기서 index.jsp로 이동.
@Controller
public class FileController {
	
	@Autowired
	private FileDao fileService;
	
	//포트폴리오 리스트 폼
	//DB에서 포트폴리오, 이력서 리스트 뽑아와야됨
	@RequestMapping(value = "/portFolio.html", method = RequestMethod.GET)
    public ModelAndView fileList(HttpSession session) throws NoSuchFieldException, SecurityException, IOException, URISyntaxException {
        System.out.println("파일 리스트 출력");
		ModelAndView mv = new ModelAndView();
        String loginId = (String) session.getAttribute("loginId");	// 로그인시 세션에 저장된 아이디 불러옴
        String kind = (String) session.getAttribute("kind");
        System.out.println("리스트 출력에서 세션 아이디 = " + loginId);
        ArrayList<?> fileList = this.fileService.fileList(loginId);	//	회원 아이디를 넘겨주므로서 아이디와 일치하는 자료들 리스트를 받을 수 있음;
        System.out.println("kind = " + kind);
        ArrayList<?> hitList = this.fileService.hitList(kind);
        System.out.println("hitlist = " + hitList);
        mv.setViewName("index");
        mv.addObject("content", "/WEB-INF/portfolio/pofolListForm.jsp"); // 바뀔 페이지값 넘겨줌
        mv.addObject("fileList", fileList);	//해당 페이지에서 el로 값 받으면됨
        mv.addObject("hitList", hitList);
        return mv ;
    }
	
	//파일 등록 폼
	@RequestMapping(value = "/fileRegView.html", method = RequestMethod.GET)
    public ModelAndView fileRegView() {
		System.out.println("파일 등록 폼이동");
        ModelAndView mv = new ModelAndView(); 
        mv.setViewName("index");
        mv.addObject("content", "/WEB-INF/portfolio/pofolRegForm.jsp"); // 바뀔 페이지값 넘겨줌
        return mv;
    }
	
    //포트폴리오 등록처리
	//파일 등록시 회원아이디를 고유키로 사용하여 저장시킴
    @RequestMapping(value = "/fileReg.html", method = RequestMethod.POST)
    public ModelAndView fileSubmit(FileDto dto, HttpSession session, @RequestParam("file")MultipartFile file) throws ServletRequestBindingException{
    	System.out.println("파일 등록 코드");
    	String loginId = (String) session.getAttribute("loginId");	//세션에 저장된 로그인 아이디 불러옴
    	dto.setMember_id(loginId);
    	String root_path = session.getServletContext().getRealPath("/");	//웹 서비스 root경로
        String attach_path = "/WEB-INF/" + loginId + "/";	//아이디 별로 폴더 만들어서 관리함       
        if (file != null) {
        	String fileName = file.getOriginalFilename(); //파일의 이름을 구함
        	dto.setFile_name(fileName); //파일 이름을 dto에 넣어줌
            try {
                File file1 = new File(root_path + attach_path + fileName);
                File file2 = new File(root_path + attach_path);
                //디렉토리 생성
                if(file1.exists()) {
                	System.out.println("파일이 이미 존재함");
                }
                else {
                	System.out.println("디렉토리 생성");
                	file2.mkdirs();
                }
                
                file.transferTo(file1);
                 
                int row1 = this.fileService.compareFile(fileName, loginId);
                System.out.println("row1 = " + row1);
                if(row1 > 0)
                {
                	System.out.println("같은 아이디에 같은 파일이 존재하면 경고페이지로감"); 
                	String url = "redirect:/error.html";
                    return new ModelAndView(url);
                }
                int row2 = this.fileService.insertFile(dto); //파일 내용 DB저장 , dto를 넘겨줌
                if(row2 > 0) {
                	System.out.println("파일 업로드에 성공하셨습니다.");
                }
                else {
                	System.out.println("파일 업로드에 실패하셨습니다.");
                } 
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 데이터 베이스 처리를 현재 위치에서 처리
        String url = "redirect:/portFolio.html";
        return new ModelAndView(url);
    }
    
    @RequestMapping(value = "/error.html", method = RequestMethod.GET)
    public ModelAndView error() {
		System.out.println("에러 처리 메소드");
    	ModelAndView mv = new ModelAndView();
    	String type = "같은 이름의 파일이 존재합니다. 파일명을 변경하여 다시 시도해 주십시오.";
    	System.out.println("type = " + type);
    	mv.setViewName("/error/error");
    	mv.addObject("type", type);
        return mv;
    }
	
    //파일 삭제
	@RequestMapping(value = "/fileDelete.html", method = RequestMethod.GET)
    public ModelAndView fileDelete(HttpSession session, HttpServletRequest request, FileDto dto) {
		System.out.println("파일삭제");
		String loginId = (String) session.getAttribute("loginId");
		String root_path = session.getServletContext().getRealPath("/");	//웹 서비스 root경로
        String attach_path = "/WEB-INF/" + loginId + "/";    
        int pr_key = Integer.parseInt(request.getParameter("pr_key")); //지울 파일의 식별키 받아옴
        String file_name = (String) request.getParameter("file_name");
        System.out.println("key, name = " + pr_key + ", " + file_name);
        String fileName = file_name;
        
        File file = new File(root_path + attach_path + fileName);
        file.delete(); //파일 삭제
        dto.setPr_key(pr_key);
        int row = this.fileService.removeFile(dto); //파일 DB 삭제
        if(row > 0) {
        	System.out.println("파일 삭제 성공");
        }
        else
        	System.out.println("파일 삭제 실패");
        
        String url = "redirect:/portFolio.html";
        return new ModelAndView(url);
    } 
    
    @RequestMapping(value = "/fileDown.html", method = RequestMethod.GET)
    public ModelAndView fileDownload(HttpSession session, HttpServletResponse response , HttpServletRequest request) throws UnsupportedEncodingException{
    	System.out.println("파일 다운로드 코드");
    	String loginId = (String)session.getAttribute("loginId");
    	String dataDirectory = request.getServletContext().getRealPath("/WEB-INF/" + loginId + "/");
    	String fileName = request.getParameter("filename");
    	System.out.println("파일 다운시 파일이름" + fileName);
    	String endFileName = java.net.URLEncoder.encode(fileName, "UTF-8");
    	File file1 = new File(dataDirectory, fileName);
    	if (file1.exists()) {
    		response.setContentType("application/vnd.ms-excel");
    		response.addHeader("Content-Disposition", "attachment; filename=" + endFileName);
    		byte[] buffer = new byte[1024];
    		// if you're using Java 7, use try-with-resources
    		try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file1)); OutputStream os = response.getOutputStream()) {
    			int i = bis.read(buffer);
        		while (i != -1) {
        		os.write(buffer, 0, i);
        		i = bis.read(buffer);
        		}
    		} catch (IOException ex) {
    			System.out.println (ex.toString());
    		} // edn try-with-resource
    	} // end if
		return null;
    }    
}